﻿using PesticideManage.Domain.AggregatesModel.PesticideAggregate;
using Shang.Microservice.Domain.Abstructions.SeedWork;
using System.ComponentModel.DataAnnotations;

namespace PesticideManage.Domain.AggregatesModel.BatchQRCodeAggregate;
public sealed class BatchQRCode : Entity
{
    const string UrlPath = "#/pesicideinfo/details/";
    public override int Id { get; set; }
    public int UserId { get; set; }

    public override DateTime CreateTime { get; set; } = DateTime.Now;
    [StringLength(255)]
    public string FileName { get; set; } = string.Empty;
    public int FileStoreSource { get; set; }
    /// <summary>
    /// 第9到11位,产品规格码产品规格码，企业自行编制<br/>
    /// 用作批次号
    /// </summary>
    [Range(1, 999, ErrorMessage = "批次号范围1~999.")]
    public int ProductSpecificationCode { get; set; } = 1;
    /// <summary>
    /// 前台网址，二维码展示网址
    /// </summary>
    // [StringLength(255)]
    //  public string Host { get; set; } = "https://qrcode.dd100.cc/#/pesicideinfo/details/";
    public Pesticide? Pesticide { get; set; } = null!;
    [Range(1, 9999999, ErrorMessage = "数量不能超过1千万.")]
    public int Count { get; set; } = 1;

    /// <summary>
    /// 合并可追溯Id (前25位)
    /// </summary>
    /// <returns></returns>
    /// <exception cref="ArgumentNullException"></exception>
    public string CombineTraceableId()
    {
        if (Pesticide == null)
        {
            throw new ArgumentNullException(nameof(Pesticide), "产品为空");
        }
        var b1_8 = Pesticide.组合前8位溯源码();

        // 产品规格码，企业自行编制
        var 第9到11位 = ProductSpecificationCode.ToString().PadLeft(3, '0');
        var 第12到15位 = Pesticide.Id.ToString().PadLeft(4, '0');

        string 第16到25位 = CreateTime.ToString("yyMMddHHmm");

        return @$"{b1_8}{第9到11位}{第12到15位}{第16到25位}";

    }

    /// <summary>
    /// 导出溯源码 流
    /// </summary>
    /// <param name="referer"></param>
    /// <returns>溯源码流</returns>
    public MemoryStream ExportTraceableId(string? referer)
    {
        referer ??= "https://qrcode.dd100.cc/";
        var url = $"{referer}{UrlPath}";
        // 组合前25位溯源码
        string traceableId = CombineTraceableId();
        url += traceableId;
        // 32+ /r/n 占2位 =34
        int capacity = (url.Length + 34) * Count;
        // MemoryStream如果使用using语句，会在离开代码块的时候自动关闭，实际上ASP.NET CORE会自动处理关闭的事项，不需要使用using语句。
        var stream = new MemoryStream(capacity);
        var writer = new StreamWriter(stream);

        // 后7位序号
        for (int i = 1; i <= Count; i++)
        {
            string value = $"{url}{i.ToString().PadLeft(7, '0')}";
            writer.WriteLine(value);
        }
        // 记得在使用writer之后使用Flush()以确保数据有写入。
        writer.Flush();
        // 由于生成文件的过程是从文件流的开头一直进行到末尾的，因此向请求端返回结果时，应当重置Stream的游标，从0开始传输。
        stream.Position = 0;
        return stream;
    }

}

public class InvalidQRCode
{
    [Key]
    public string TraceableId { get; set; } = string.Empty;
}